#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <termios.h>
#include "gps.h"

int set_opt(int fd,int nBits,char nEvent,int nSpeed,int nStop)
{
	struct termios newtio,oldtio;
	
	if(tcgetattr(fd,&oldtio)!=0)
	{
		perror("setup serial 1");
		return -1;
	}
	
	bzero(&newtio,sizeof (newtio));
	newtio.c_cflag|=CLOCAL|CREAD;
	newtio.c_cflag&=~CSIZE;
	
	/*选择比特率*/
	switch(nBits)
	{
		case 7:
		newtio.c_cflag|=CS7;
		break;
		
		case 8:
		newtio.c_cflag|=CS7;
		break;
	}
	
	switch(nEvent)
	{
		//奇校验
		case 'O':
		    newtio.c_cflag |= PARENB;
            newtio.c_cflag |= PARODD;
            newtio.c_iflag |= (INPCK | ISTRIP);
		break;
		//偶校验
		case 'E':
		    newtio.c_iflag |= (INPCK | ISTRIP);
            newtio.c_cflag |= PARENB;
            newtio.c_cflag &= ~PARODD;
		break;
		
		case 'N':
		newtio.c_cflag &= ~PARENB;
		break;
	}
	
	switch(nSpeed)
	{
		case 2400:
			cfsetispeed(&newtio, B2400);
            cfsetospeed(&newtio, B2400);
		break;
		
		case 4800:
			cfsetispeed(&newtio, B4800);
            cfsetospeed(&newtio, B4800);
		break;
		
		case 9600:
			cfsetispeed(&newtio, B9600);
            cfsetospeed(&newtio, B9600);
		break;
		
		case 115200:
			cfsetispeed(&newtio, B115200);
            cfsetospeed(&newtio, B115200);
		break;
		
		default:
			cfsetispeed(&newtio, B9600);
            cfsetospeed(&newtio, B9600);
		break;
	}
	
	if( nStop == 1 )
    {
        newtio.c_cflag &=  ~CSTOPB;
    }
    else if ( nStop == 2 )
    {
        newtio.c_cflag |=  CSTOPB;
    }

    newtio.c_cc[VTIME] = 0;
    newtio.c_cc[VMIN] = 0;
    tcflush(fd,TCIFLUSH);
	
    if((tcsetattr(fd,TCSANOW,&newtio))!=0)
    {
        perror("com set error");
        return -1;
    }
    return 0;
}
